/*
 * 代号：凤凰
 * http://www.jphenix.org
 * 2024年8月2日
 * V4.0
 */
package com.jphenix.share.util;

//#region 【引用区】
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import com.jphenix.standard.docs.ClassInfo;
//#endregion

//#region 【说明区】
/**
 * 类工具
 * com.jphenix.share.util.BeanUtil
 * 
 * @author MBG
 * 2024年8月2日
 */
//#endregion
@ClassInfo({"2024-08-02 16:29","类工具"})
public class BeanUtil {
	
	//#region toDataMap(bean) 将Bean类实例中的数据，以Map格式返回
	/**
	 * 将Bean类实例中的数据，以Map格式返回
	 * @param bean   待处理的数据类
	 * @return       数据容器
	 * 2024年8月2日
	 * @author MBG
	 */
	public static Map<String,Object> toDataMap(Object bean) {
		// 构建返回值
		Map<String,Object> reMap = new HashMap<>();
		if(bean==null) {
			return reMap;
		}
		// 获取该类中所有的类变量
		Field[] fields = bean.getClass().getDeclaredFields();
		if(fields==null) {
			return reMap;
		}
		String methodName;
		Method method;
		for(int i=0;i<fields.length;i++) {
			//#region 如果是public，直接设置该值
			if(Modifier.isPublic(fields[i].getModifiers())) {
				try {
					reMap.put(fields[i].getName(),fields[i].get(bean));
				}catch(Exception e) {
					e.printStackTrace();
				}
				continue;
			}
			//#endregion
			
			//#region 通过get方法取值设置到容器中
			methodName = fields[i].getName();
			if(methodName==null || methodName.length()<1) {
				continue;
			}
			if(fields[i].getType()==boolean.class || fields[i].getType()==Boolean.class) {
				if(methodName.toLowerCase().startsWith("is")) {
					methodName = "is"+methodName.substring(2,3).toUpperCase()+methodName.substring(3);
				}else {
					methodName = "is"+methodName.substring(0,1).toUpperCase()+methodName.substring(1);
				}
			}else {
				methodName = "get"+methodName.substring(0,1).toUpperCase()+methodName.substring(1);
			}
			try {
				method = bean.getClass().getMethod(methodName,new Class[] {});
			}catch(Exception e) {
				// 没有get方法
				continue;
			}
			try {
				reMap.put(fields[i].getName(),method.invoke(bean,new Object[] {}));
			}catch(Exception e) {
				e.printStackTrace();
			}
			//#endregion
		}
		return reMap;
	}
	//#endregion

}









